package chapter07;

/**
 * Created by Miracle yaochengwei on 2022/6/28 21:53
 */
public class VarScopeDetail {
    //全局变量/属性:可以被本类使用，或其他类使用(通过对象调用
//局部变量只能在 本类中使用
    static class T{
        public void test(){
            Person p1 =  new Person();
            System.out.println(p1.name);//jack
        }
        public void test2(Person p){
            System.out.println(p.name);
        }
    }
    static class Person {
        private int age = 20;//全局变量 属性可以加修饰符（public protected private.. ）  局部变量 属性不能加修饰符
        String name = "jack"; //全局变量
        public void say() {
            //细节属性和局部变量可以重名,访问时遵循就近原则
            String name = "king";  //局部变量
            System.out.println("say() name=" + name);
        }

        //在同一个作用域中，比如在同一个成员方法中，两个局部变量,不能重
        public void hi() {
            String address = "北京";
//            String address = "上海";//错误重复定义变量
            String name = "hsp"; //有三个name 可以的作用范围不同
        }

        public static void main(String[] args) {
            Person p1 = new Person();
             /*
属性生命周期较长，伴随着对象的创建而创建，伴随着对象的销毁而销毁。
局部变量,生命周期较短，伴随着它的代码块的执行而创建，
伴随着代码块的结束而销毁。即在次方法调用过程中
*/
            p1.say();//当执行say方法时,say方法的局部变量比如name,会创建，当say执行完毕后
            // name局部变量就销毁,但是属性(jack是全局变量)(全局变量)仍然可以使用
            T t1 = new T();
            t1.test();//第一种跨类访问对象属性的方式

            t1.test2(p1);//第二种跨类访问对象属性的方式
        }
    }
}
